package process

import (
	"encoding/json"
	"fmt"
	"my-go-chat/message"
	"my-go-chat/model"
	"my-go-chat/utils"
	"net"
)

type UserProcess struct {
	Conn net.Conn
}

//serverProcessLogin函数 专门处理登录请求
func (up *UserProcess) ServerProcessLogin(mes *message.Message) (err error) {
	// 先从mes 中取出mes.Data 并直接反序列化威威LoginMes
	var loginMes message.LoginMes
	err = json.Unmarshal([]byte(mes.Data), &loginMes)
	if err != nil {
		err = fmt.Errorf("登录信息反序列化失败 : %w", err)
		return
	}

	//1先声明一个resMes
	var resMes message.Message
	resMes.Type = message.LoginResMesType

	//2再申明一个LoginResMes
	var LoginResMes message.LoginResMes

	// 这里到数据库完成验证
	//使用 MyUserDao 到redis内进行验证
	user, err := model.MyUserDao.Login(loginMes.UserId, loginMes.UserPwd)
	if err != nil {

		LoginResMes.Code = 500
	} else {
		LoginResMes.Code = 200
	}

	// //如果用户id 为100  ，密码123456 就是合法
	// if loginMes.UserId == 100 && loginMes.UserPwd == "123456" {
	// 	//合法
	// 	LoginResMes.Code = 200
	// } else {
	// 	//不合法
	// 	LoginResMes.Code = 500 //表示该用户不存在
	// 	LoginResMes.Error = "用户不存在,请先注册"
	// }

	//3将 loginResMes 序列化
	data, err := json.Marshal(LoginResMes)
	if err != nil {
		err = fmt.Errorf("登录结果返回失败！ data : %w", err)
		return
	}

	//4. 将data赋值给resMes
	resMes.Data = string(data)

	//5. 对resMes进行序列化 准备发送
	data, err = json.Marshal(resMes)
	if err != nil {
		err = fmt.Errorf("登录结果返回失败！ resMes: %w", err)
		return
	}

	//6。发送data ，我们将其封装到一个writePkg函数中
	//因为使用了分层的模式 mvc  我们先创建一个Transfer 实例 然后读取
	tf := &utils.Transfer{
		Conn: up.Conn,
	}
	err = tf.WritePkg(data)
	if err != nil {
		err = fmt.Errorf("conn.write pkg err =  %v ", err)
	}
	return
}
